﻿#region Using Statements
using System;
using System.Collections.Generic;
using System.Text;
using starLiGHT.Physic.TwoD;
using Microsoft.Xna.Framework;

#endregion

#region COPYRIGHT

/*
    Copyright (c) 2008, 2009, 2010 
        Roland Rosenkranz (Glatzemann@email.de)
*/

#endregion

#region LICENSE

/*
    This file is part of starLiGHT.Collision.

    starLiGHT.Collision is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    starLiGHT.Collision is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with starLiGHT.Collision.  If not, see <http://www.gnu.org/licenses/>.

    
    ADDITIONAL (commercial) LICENSES for starLiGHT.Collision are available on request.
*/

#endregion

#region Version Stuff
// **************[ starLiGHT.Engine SVN ]**********************
// * $Rev:: 1486                  $:  Revision of last commit *
// * $Author:: glatzemann         $:  Author of last commit   *
// * $Date:: 2010-10-08 15:55:47 #$:  Date of last commit     *
// ************************************************************
#endregion

namespace starLiGHT.Physic
{
    /// <summary>
    /// This is a simplest joint in the physic system. It maintains two points on two bodies constant.
    /// </summary>
    /// <remarks>
    /// When you specify a distance joint the two connected bodies should already be in place.
    /// </remarks>
    public class DistanceJoint2D : Joint2D
    {
        #region Constructors
        /// <summary>
        /// Creates a new DistanceJoint. The length of the joint is calculated automatically. The 
        /// anchor points are the center positions of the bodies.
        /// </summary>
        /// <param name="body1">"Left" body to connect by the distance joint.</param>
        /// <param name="body2">"Right" body to connect by the distance joint.</param>
        public DistanceJoint2D(RigidBody2D body1, RigidBody2D body2)
        {
            DistanceJointDef jointDef = new DistanceJointDef();
            jointDef.Initialize(body1.Body, body2.Body, body1.Position, body2.Position);
            jointDef.collideConnected = false;

            base.Joint = PhysicSystem2D.Instance.World.CreateJoint(jointDef);

            PhysicSystem2D.Instance.managedJoints.Add(this);
        }

        /// <summary>
        /// Creates a new DistanceJoint. The length of the joint is calculated automatically. The 
        /// anchor points are world coordinates. The first anchor is on body1 and the second one is on 
        /// body2.
        /// </summary>
        /// <param name="body1">"Left" body to connect by the distance joint.</param>
        /// <param name="body2">"Right" body to connect by the distance joint.</param>
        /// <param name="worldAnchor1">Anchor on "left" body in world coordinates.</param>
        /// <param name="worldAnchor2">Anchor on "right" body in world coordinates.</param>
        public DistanceJoint2D(RigidBody2D body1, RigidBody2D body2, Vector2 worldAnchor1, Vector2 worldAnchor2)
        {
            DistanceJointDef jointDef = new DistanceJointDef();
            jointDef.Initialize(body1.Body, body2.Body, worldAnchor1, worldAnchor2);
            jointDef.collideConnected = false;

            base.Joint = PhysicSystem2D.Instance.World.CreateJoint(jointDef);

            PhysicSystem2D.Instance.managedJoints.Add(this);
        }

        #endregion

        /// <summary>
        /// The internal joint of the physic system.
        /// </summary>
        public new DistanceJoint Joint
        {
            get { return (DistanceJoint)base.Joint; }
        }

        /// <summary>
        /// The calculated length of the distance joint (the distance between the two anchor points).
        /// </summary>
        public float JointLength
        {
            get { return Joint.GetLength(); }
        }
    }
}
